/**
*  \file sched.c
*
*  \brief Scheduler for windows architecture.
*
*  \author Michael J. Hohmann  <michael.hohmann@linde-mh.de>
*
*
*/

/*===============================================[ private includes  ]================================================*/
#include "sched.h"
#include "../assertor/assertor.h"
#include "../cfg/prj.h"
#include "../pal/pal_mem.h"

/*===============================================[ private defines   ]================================================*/
#define SCHEDULER_TIME_SLICES_MAX U16_CONST( 4 )

/*===============================================[ private datatypes ]================================================*/

/** Private variables */
struct sched_private
{
    struct tasklet_list   list[ SCHEDULER_TIME_SLICES_MAX ];
	U32 frequency;        /* ticks per second */
    U32 starttime;        /* ticks */
};


/*===============================================[ private variables ]================================================*/
static struct sched_private sched;

/*===============================================[ private functions ]================================================*/
/*===============================================[ inline functions  ]================================================*/

/*===============================================[ public functions  ]================================================*/
RC sched_initialize( void )
{
	pal_memzero( (void*)&sched, sizeof( sched ) );

	tasklet_list_initialize(&sched.list[0],NIL );
	tasklet_list_initialize(&sched.list[1],NIL );
	tasklet_list_initialize(&sched.list[2],NIL );
	tasklet_list_initialize(&sched.list[3],NIL );

	return RC_SUCCESS;
}

void sched_run_idle(void)
{
    tasklet_perform(&sched.list[3]);
}


void sched_run_1ms(void)
{
    tasklet_perform(&sched.list[0]);
}

void sched_run_10ms(void)
{
    tasklet_perform(&sched.list[1]);
}
void sched_run_100ms(void)
{
    tasklet_perform(&sched.list[2]);
}


struct tasklet_list* sched_get_slice_1ms( void )
{
	return &sched.list[0];
}

struct tasklet_list* sched_get_slice_10ms( void )
{
	return &sched.list[1];
}

struct tasklet_list* sched_get_slice_100ms( void )
{
	return &sched.list[2];
}

struct tasklet_list* sched_get_slice_idle( void )
{
	return &sched.list[3];
}

/*===============================================[ private functions ]================================================*/



/***********************************************************************************************************************
*                             Copyright 2018 Linde Material Handling. All rights reserved.                             *
***********************************************************************************************************************/
